"""
encoding = 'utf-8'
@author : ffine
@time   : 2022-05-03  20:22
@IDEA   : PyCharm
@goal   : 高阶函数
"""

"""
map()函数接收两个参数, 一个是函数, 一个是Iterable,
map将传入的函数依次作用到序列的每个元素, 并把结果作为新的Iterator返回
如果传入的函数接收一个参数, 则可以使用lambda表达式
"""

list1 = [1, 2, 3, 4, 5]
list2 = [6, 7, 8, 9, 10]
list3 = [
	(4, 'a'),
	(1, 'f'),
	(2, 'g'),
	(6, 'b'),
	(3, 'z'),
]

print(sorted(list3, key=lambda x: x[0]))    # 按照第一个元素排序:[(1, 'f'), (2, 'g'), (3, 'z'), (4, 'a'), (6, 'b')]
print(sorted(list3, key=lambda x: x[1]))    # 按照第二个元素排序:[(4, 'a'), (6, 'b'), (1, 'f'), (2, 'g'), (3, 'z')]
result = map(lambda x: x ** 2, list1)
print(type(result),list(result))    # <class 'map'> [1, 4, 9, 16, 25]
res = map(lambda x, y: x + y, list1, list2) # 可以传入多个参数
print(list(res))    # [7, 9, 11, 13, 15]


"""
规约:
reduce()函数接收两个参数, 一个是函数, 一个是Iterable,
reduce把结果继续和序列的下一个元素做累积计算, 其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
"""
from functools import reduce
res = reduce(lambda x, y: x + y, list1)
print(res)    # 15

res = reduce(lambda x, y: x + y, range(1, 101))
print(res)    # 5050


res = reduce(lambda x, y: x + y, range(1, 101), 1)  # 可以传入初始值,再最开始时计算
print(res)  # 5051


"""
filter()函数接收两个参数, 一个是函数, 一个是Iterable,
filter把传入的函数依次作用于每个元素, 然后根据返回值是True还是False决定保留还是丢弃该元素
"""
ress = filter(lambda x: x % 2 == 0, list1)
print(list(ress))    # [2, 4]
